/*******************************************************************************
* Copyright (c) 2015 Jeff Martin.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser General Public
* License v3.0 which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl.html
*
* Contributors:
* Jeff Martin - initial API and implementation
******************************************************************************/
package cuchaz.enigma.mapping;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class MappingsWriter
{
public void write(Writer out, Mappings mappings) throws IOException
{
write(new PrintWriter(out), mappings);
}
public void write(PrintWriter out, Mappings mappings) throws IOException
{
for(ClassMapping classMapping : sorted(mappings.classes()))
write(out, classMapping, 0);
}
private void write(PrintWriter out, ClassMapping classMapping, int depth)
throws IOException
{
if(classMapping.getDeobfName() == null)
out.format("%sCLASS %s\n", getIndent(depth),
classMapping.getObfFullName());
else
out.format("%sCLASS %s %s\n", getIndent(depth),
classMapping.getObfFullName(), classMapping.getDeobfName());
for(ClassMapping innerClassMapping : sorted(classMapping.innerClasses()))
write(out, innerClassMapping, depth + 1);
for(FieldMapping fieldMapping : sorted(classMapping.fields()))
write(out, fieldMapping, depth + 1);
for(MethodMapping methodMapping : sorted(classMapping.methods()))
write(out, methodMapping, depth + 1);
}
private void write(PrintWriter out, FieldMapping fieldMapping, int depth)
throws IOException
{
out.format("%sFIELD %s %s %s\n", getIndent(depth),
fieldMapping.getObfName(), fieldMapping.getDeobfName(),
fieldMapping.getObfType().toString());
}
private void write(PrintWriter out, MethodMapping methodMapping, int depth)
throws IOException
{
if(methodMapping.getDeobfName() == null)
out.format("%sMETHOD %s %s\n", getIndent(depth),
methodMapping.getObfName(), methodMapping.getObfSignature());
else
out.format("%sMETHOD %s %s %s\n", getIndent(depth),
methodMapping.getObfName(), methodMapping.getDeobfName(),
methodMapping.getObfSignature());
for(ArgumentMapping argumentMapping : sorted(methodMapping.arguments()))
write(out, argumentMapping, depth + 1);
}
private void write(PrintWriter out, ArgumentMapping argumentMapping,
int depth) throws IOException
{
out.format("%sARG %d %s\n", getIndent(depth),
argumentMapping.getIndex(), argumentMapping.getName());
}
private <T extends Comparable<T>> List<T> sorted(Iterable<T> classes)
{
List<T> out = new ArrayList<T>();
for(T t : classes)
out.add(t);
Collections.sort(out);
return out;
}
private String getIndent(int depth)
{
StringBuilder buf = new StringBuilder();
for(int i = 0; i < depth; i++)
buf.append("\t");
return buf.toString();
}
}